﻿using System;
using System.IO;

namespace UtilZ.Dotnet.Ex.Communication.Net.Ftp
{
    /// <summary>
    /// 返回当前状态
    /// Returns the current status.
    /// </summary>
    internal class FtpSTATCommand : FtpCommandAbs
    {
        /***********************************************************************************************************
        * [STAT]（Status,状态）命令
        * 说明：使一个状态响应以应答的形式通过控制连接发送出去
        * 
        * 用法:STAT[<PathName>]<CRLF>
        * 参数：PathName是服务器上的一个有效路径。
        * 例子：
        * SendData "STAT /users/johnsmith/mylilE" + “/r/n
        * 
        * 注释：STAT可以在文件传输（连同Telnet  IP和Synch信号一起——请参看RFC959的FTP Commands部分）期间发送，在此情况下服务器将响应操作中的进程状态，或者在两次文件传输之间发送。在后一种情况下，这条命令可以带一参数字段。如 果指定了一个完整的路径名，STAT将类似于LIST命令，除了它的数据是通过控制连接传送的之外。如果指定的是一个局部路径，服务器将在响应中给出一份 与指定项相关联的文件名或属性列表。如果不指定参数，服务器将返回有关此服务器FTP进程的常规状态信息，这其中包括当前所有传输参数的值和连接状态。
        * 
        * 返回值如下（粗体表示成功）：
        * 211  系统状态，或系统的帮助应答。
        * 212  目录状态。
        * 213  文件状态。
        * 421  服务不可用，关闭控制连接。
        * 
        * 如果某项服务获知自己即将关闭，会向所有命令做出这个应答。
        * 450  请求的文件操作无法执行，文件不可用（例如文件正忙）。
        * 500  语法错误，无法识命令。这其中包括包令行过长类的错误。
        * 501  参数或变元中有语法错误。
        * 502  命令还没有被实现。
        * 530  无法登录。
        * 
        ************************************************************************************************************/


        public FtpSTATCommand()
            : base()
        {

        }


        protected override string[] GetNames()
        {
            return new string[] { FtpCommands.STAT };
        }

        protected override IFtpResponse PrimitiveExcute(FtpSession session, string command, string commandLine)
        {
            //未抓包验证
            //Request: STAT 7z1805-x64.exe
            //Response: 550 Access is denied.                   失败
            //Response: 250 DELE command successful.            成功

            try
            {
                if (!session.AllowRead())
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code550, "Access is denied. ");
                }

                string path = commandLine;
                if (string.IsNullOrEmpty(path))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code500, "The path parameter is required");
                }

                string localFilePath = session.GetLocalPath(path);
                if (File.Exists(localFilePath))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code213, "file exist.");
                }
                else if (Directory.Exists(localFilePath))
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code212, "directory exist.");
                }
                else
                {
                    return new FtpCodeResponse(FtpStatusCodes.Code211, "not found file or directory.");
                }
            }
            catch (Exception ex)
            {
                return new FtpCodeResponse(FtpStatusCodes.Code451, ex.Message);
            }
        }
    }

}
